package controller;

import javax.swing.JOptionPane;

import bean.DesignDeSom;
import bean.DesignGrafico;
import bean.Programador;

public class Menu {

	private FuncionarioControl funcionarioControl;
	
	public static final String MENU_PRINCIPAL = "1- Inserir Funcionário " +
											  "\n2- Excluir Funcionário " +
											  "\n3- Alterar Informações" +
											  "\n4- Listar Funcinários " +
											  "\n0- Sair";
	
	public static final String MENU_INSERIR_FUNCIONARIO = "1- Programador " +
														"\n2- Design Gráfico" +
														"\n3- Design de Sons" +
														"\n0- Cancelar";
	
	public static final String MENU_EXCLUIR_FUNCIONARIO = "Excluir funcionário por: \n" +
														  "1 - Código" +
														"\n2 - Nome " +
														"\n3 - Todos " +
														"\n0 - Cancelar \n";
	
	public static final String MENU_ALTERAR_FUNCIONARIO = "Alterar por: " +
														"\n1- Código " +
														"\n2- Nome " +
														"\n0- Cancelar";
	

	
	public Menu() {
		this.funcionarioControl = new FuncionarioControl();
	}

	public void menu() {

		int opcao = -1;

		while (opcao != 0) {

			try {

				opcao = Integer.parseInt(JOptionPane.showInputDialog(MENU_PRINCIPAL));
				
				switch (opcao) {

				case 1:
					inserirFuncionario();
					break;

				case 2:
					if(funcionarioControl.existeFuncionario())	
						excluirFuncionario();
					else
						msgListaVazia();
					break;

				case 3:
					if(funcionarioControl.existeFuncionario())
						alterarFuncionario();
					else
						msgListaVazia();
					break;

				case 4:
					if(funcionarioControl.existeFuncionario())
						listarFuncionarios();
					else
						msgListaVazia();
					break;

				case 0:
					System.exit(0);
				default:
					throw new Exception();
				}
			} catch (Exception e) {
				msgOpcaoInvalida();
				opcao = -1;
			}
		}
	}

	public void inserirFuncionario() {

		int opcao = -1;

		while (opcao != 0) {

			try {
				opcao = Integer.parseInt(JOptionPane.showInputDialog(MENU_INSERIR_FUNCIONARIO));

				switch (opcao) {
				case 1:
					getFuncionarioControl().inserirFuncionario(new Programador());
					opcao = 0;
					break;

				case 2:
					getFuncionarioControl().inserirFuncionario(new DesignGrafico());
					opcao = 0;
					break;

				case 3:
					getFuncionarioControl().inserirFuncionario(new DesignDeSom());
					opcao = 0;
					break;

				case 0:
					opcao = 0;
					break;
				default:
					throw new Exception();
				}
			} catch (Exception e) {
				msgOpcaoInvalida();
				opcao = -1;
			}
		}
	}

	public void excluirFuncionario() {

		int opcao = -1;

		while (opcao != 0) {

			try {

				opcao = Integer.parseInt(JOptionPane.showInputDialog(MENU_EXCLUIR_FUNCIONARIO));

				switch (opcao) {

				case 1: 
					int codigo = Integer.parseInt(JOptionPane.showInputDialog("Entre com o código do funcionário"));
					getFuncionarioControl().excluirFuncionario(codigo);
					opcao = 0;
					break;

				case 2: 
					String nome = JOptionPane.showInputDialog("Digite o nome do funcionário");
					String resultado = getFuncionarioControl().buscarPorNome(nome);

					if (resultado != null && !resultado.isEmpty()) {
						
						try {
							codigo = Integer.parseInt(JOptionPane.showInputDialog(resultado));
							getFuncionarioControl().excluirFuncionario(codigo);
						} catch (Exception e) {
							JOptionPane.showMessageDialog(null, "O código digitado é inválido", "Erro:.", JOptionPane.ERROR_MESSAGE);
						}						
					
					} else {
						JOptionPane.showMessageDialog(null,	"Nenhum funcionário encontrado com este nome");
					}
					
					opcao = 0;
					break;

				case 3: 
					int confirmacao = JOptionPane.showConfirmDialog(null, "Deseja remover todos os funcionários cadastrados?", "", JOptionPane.YES_NO_OPTION);
					
					if(confirmacao == 0)
						getFuncionarioControl().excluirFuncionario();
				
					opcao = 0;
					break;

				case 0:
					opcao = 0;
					
				default:
					throw new Exception();
				}
			} catch (Exception e) {
				msgOpcaoInvalida();
				opcao = -1;
			}
		}
	}

	public void alterarFuncionario() {
		
		
		int opcao = -1;

		while (opcao != 0) {

			opcao = Integer.parseInt(JOptionPane.showInputDialog(MENU_ALTERAR_FUNCIONARIO));
			int codigo;
			
			try {
				switch (opcao) {

				case 1: 
					codigo = Integer.parseInt(JOptionPane.showInputDialog("Entre com o código"));
					funcionarioControl.alterarFuncionario(codigo);
					opcao = 0;
					break;

				case 2: 
					String nome = JOptionPane.showInputDialog("Entre com o nome");
					String resultado = funcionarioControl.buscarPorNome(nome);

					if (resultado != null && !resultado.isEmpty()) {
						codigo = Integer.parseInt(JOptionPane.showInputDialog(resultado));
						funcionarioControl.alterarFuncionario(codigo);
					} else {
						JOptionPane.showMessageDialog(null,	"Nenhum registro encontrado");
					}
					opcao = 0;
					break;

				case 0:
					menu();
				default:
					throw new Exception();
				}
			} catch (Exception e) {
				msgOpcaoInvalida();
				opcao = -1;
			}
		}
	}

	public void listarFuncionarios() {
		String out = getFuncionarioControl().listarFuncionarios();
		if (out != null && !out.isEmpty())
			JOptionPane.showMessageDialog(null, out);
		else
			msgListaVazia();
	}
	
	
	public void msgListaVazia(){
		JOptionPane.showMessageDialog(null, "Nenhum funcionário cadastrado!", "Atenção", JOptionPane.WARNING_MESSAGE);
	}
	
	public void msgOpcaoInvalida(){
		JOptionPane.showMessageDialog(null, "Opção inválida", "Erro:.",	JOptionPane.ERROR_MESSAGE);
	}
	
	public FuncionarioControl getFuncionarioControl() {
		return funcionarioControl;
	}

	public void setFuncionarioControl(FuncionarioControl funcionarioControl) {
		this.funcionarioControl = funcionarioControl;
	}

}
